# 模块(module)
# 模块是指将一个完整的程序拆分成若干个模块，通过模块间的组合来达到相应的功能
# 模块就是将程序功能片段分别写道多个文件模块，便于开发、维护、复用
# 一个py文件就是一个模块， 模块名就是文件名，所以文件名必须符合标识符规范， 创建一个py文件就是一个模块module

# 模块引入方式：
#   1. import 模块名(文件名，不带py)
#   2. import 模块名 as 别名 (可以给模块起一个别名，简短好用的)
#   模块可以被引用多次，但是模块实例只会被创建一个
#   模块引用可以在任意位置使用，但是一般放在文件开头
#   每一个模块都有一个默认的属性名，为： __name__ 就是模块的名称

# 引入自定义的模块
import hello_module
# 模块实实例对象, class module类型
print(hello_module, type(hello_module))

# python内部库
import os
import time as t
# time模块 __name__ 为time
print(t.__name__) # time
print(os.__name__)
# 再次引入，还是只会有一个time实例
import time
print(time == t, id(time), id(t)) # 这两个实例变量指向同一个实例

# 当前文件的的module名称，这里是直接执行的本文件
# 所以__name__的值为 __main__ ，__main__代表当前运行的主模块
print(__name__) # __main__



# 包(package)
# 包也是一个模块，当模块中的代码过多时，或者一个模块太大或者很复杂需要细分为小的模块时，就需要使用到包
# 普通的文件是一个py文件，包则是一个文件夹，包中必须有一个 __init__.py文件，含有包中的主要文件
# 包可以嵌套

# 引入包
import hello_package as hello
# hello_package模块，class module类型
print(hello, type(hello))
# 使用hello模块中的属性
print('hello => ', hello.a, hello.b)
hello.hi() # 调用hello模块的函数

# 一个package对应一个文件夹，文件夹内可以包含多个py文件，也就是多个模块
# 引入hello_package文件夹中的其他模块
# 语法： from 包名 import 模块名 [as 别名], ..
from hello_package import c , d
print(c, c.c) # 使用c模块的属性
print(d, d.d)

# __pycache__ 文件夹是自动生成的，当引入使用模块(或者包)时，会自动生成该文件夹
# 此文件夹生成的是模块(或者包)编译成二进制码的缓存文件，为的是提高性能，不需要每次都解析编译

# python标准库 (内置模块) 更多参考python3文档
# 为了实现开箱即用，python提供了标准库，随python安装
#   1. sys模块 提供一些变量和函数，可以获取解析器信息，也可以通过它操作解析器，与解析器交互
#   2. os模块，与系统交互的模块
import sys

# sys.argv 列表list，获取命令行参数，通过 python xx.py arg1 arg2 ..传递的命令行参数会存在sys.argv中
# sys.modules 字典，key模块名，value模块实例对象，获取当前程序使用的模块信息
# print(sys.modules)
# pprint模块 pretty print 美化打印输出模块
import pprint
# pprint.pprint(sys.modules)

# sys.path 列表list，模块查找路径，就像java的classpath，包含当前路径和系统路径
pprint.pprint(sys.path)
# python运行平台
pprint.pprint(sys.platform)
# sys.exit() # 退出程序

import os
print(os.name) # 系统名称
# print(os.environ) # 环境变量，很多
# os.system('dir') # 执行命令行操作系统命令
# 更多查看文档
